package org.n3r.eql.convert;
import lombok.SneakyThrows;
import lombok.val;
import org.n3r.eql.map.RsAware;
import org.n3r.eql.util.Ob;
import org.n3r.eql.util.Rs;
import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
public class EqlConverts {
public static Object convertValue(
RsAware rs, int index,
Collection<EqlConvertAnn<EqlConvert>> eqlConvertAnns, Object value
) {
if (eqlConvertAnns.size() > 0) {
val originalValue = Rs.getResultSetValue(rs, index, null);
value = convert(eqlConvertAnns, originalValue);
}
return value;
}
@SneakyThrows
private static Object convert(
Collection<EqlConvertAnn<EqlConvert>> eqlConvertAnns,
Object value) {
Object ret = value;
Method valueMethod = EqlConvert.class.getDeclaredMethod("value");
for (val eqlConvertAnn : eqlConvertAnns) {
Class[] clazz = (Class[]) valueMethod.invoke(eqlConvertAnn.convert);
for (val aClass : clazz) {
val converter = (EqlConverter) Ob.createInstance(aClass);
ret = converter.convert(eqlConvertAnn.annotation, ret);
}
}
return ret;
}
public static <T extends Annotation> void searchEqlConvertAnns(
Annotation[] annotations, List<EqlConvertAnn<T>> ecas, Class<T> annClass) {
for (val annotation : annotations) {
if (annotation instanceof Retention) continue;
if (annotation instanceof Target) continue;
if (annotation instanceof Documented) continue;
val type = annotation.annotationType();
T convert = type.getAnnotation(annClass);
if (convert != null)
ecas.add(new EqlConvertAnn<T>(convert, annotation));
val annotations1 = type.getAnnotations();
searchEqlConvertAnns(annotations1, ecas, annClass);
}
}
public static <T extends Annotation> void searchEqlConvertAnns(
AccessibleObject accessibleObject,
List<EqlConvertAnn<T>> ecas,
Class<T> annClass) {
searchEqlConvertAnns(accessibleObject.getAnnotations(), ecas, annClass);
}
}